package com.huangjue.backend.prompt.impl;


import com.huangjue.backend.prompt.BuildPrompt;

public class BuildPromptImpl implements BuildPrompt {

    /**
     * @param role:这里就写你希望GPT扮演什么角色
     * @param skills:这里就写你希望大模型拥有哪些技能，例如：分析总结能力；优秀的写作能力；Java编码能力；
     * @param action:告诉大模型我们需要它做什么，行动是什么。
     * @param constrains:用来限制AI的边界，防止输出一些不符合我们预期的内容。
     * @param format:期望大模型输出的格式，可以是格式要求，也可以是一个格式示例。
     * @param example:可以通过一个示例，告诉大模型你想要的输出结果是什么样的，帮助它更好的理解你的诉求。
     */

    private String role;
    private String skills;
    private String action;
    private String constrains;
    private String format;
    private String example;

    /* ===== 链式 setter ===== */
    public BuildPromptImpl role(String role) {
        this.role = role;
        return this;
    }

    public BuildPromptImpl skills(String skills) {
        this.skills = skills;
        return this;
    }

    public BuildPromptImpl action(String action) {
        this.action = action;
        return this;
    }

    public BuildPromptImpl constrains(String constrains) {
        this.constrains = constrains;
        return this;
    }

    public BuildPromptImpl format(String format) {
        this.format = format;
        return this;
    }

    public BuildPromptImpl example(String example) {
        this.example = example;
        return this;
    }

    @Override
    public String buildSystemPrompt() {
        StringBuilder sb = new StringBuilder();
        appendIfNotEmpty(sb, "#角色: ", role);
        appendIfNotEmpty(sb, "#技能: ", skills);
        appendIfNotEmpty(sb, "#行动: ", action);
        appendIfNotEmpty(sb, "#限制: ", constrains);
        appendIfNotEmpty(sb, "#输出格式: ", format);
        appendIfNotEmpty(sb, "#示例: ", example);
        return sb.toString();
    }

    // 辅助方法：当内容非空时添加标题和内容
    private void appendIfNotEmpty(StringBuilder sb, String prefix, String content) {
        if (content != null && !content.trim().isEmpty()) {
            sb.append(prefix)
               .append("\n")
               .append(content)
               .append("\n");
        }
    }
}